$NG.AllReady(function (page, { useDataIndexChange, useValuesChange, useUpdateRows, useUpdateRow, useBeforeClick }) {
    const mstform = $NG.getCmpApi("p_form_work_hour_m");
    const grid = $NG.getCmpApi("p_form_work_hour_d");

    console.log(page, "page");

    if (page.oType == "add") {
        var dt = mstform.getItem("bill_dt").getValue();
        var date;
        if (typeof dt === "string") {
            date = new Date(dt);
        } else if (dt instanceof Date && !isNaN(dt)) {
            date = dt;
        } else {
            console.error("Invalid date:", dt);
        }

        // 检查是否成功创建了 Date 对象
        if (date) {
            // 获取年份，getFullYear() 返回四位数表示的年份
            var year = date.getFullYear();
            // 获取月份，getMonth() 返回的是 0-11，因此要加 1 来得到 1-12
            var month = date.getMonth() + 1;
            // 如果需要，可以将月份格式化为两位数
            month = month < 10 ? "0" + month : month;
            console.log("Year:", year, "Month:", month);
        }

        $NG.execServer("getEpmInfoByUserID", { phid: $NG.getUser().userID }, function (res) {
            const datas = JSON.parse(res.data)[0].extendObjects;
            console.log(datas);
            $NG.updateState((updater) => {
                //【注意这里的表名不能为控件ID，必须要是表名】
                updater.data.p_form_work_hour_m.setProps({
                    phid_dept: {
                        value: datas.dept_phid,
                        label: datas.dept_name,
                    },
                    u_yg: {
                        value: datas.hem_phid,
                        label: datas.hem_name,
                    },
                    u_zg_no: datas.hem_no,
                    bill_name: datas.hem_name + year + "年" + month + "月工时填报",
                });
            });
        });
        useUpdateRow(({args})=>{
            isOne(args[0])
            grid.refreshView()
        })
        useDataIndexChange(({ args, table }) => {
            var gridTab = $NG.getCmpApi("p_form_work_hour_d"); //获取tab页数据
            var row = args[0];
            console.log(row.phid_pc, "p_form_work_hour_d");
            $NG.execServer("getPtInfoByPhid", { phid: row.phid_pc }, function (res) {
                try {
                    const datas = JSON.parse(res.data)[0].extendObjects;
                    console.log(datas, "getPtInfoByPhidp_form_work_hour_d");
                    row.u_pc_no = datas.pc_no;
                    row.u_cpx = datas.midwife_phid;
                    row.u_cpx_EXName = datas.midwife_name;
                    row.u_fgs = datas.division_phid;
                    row.u_fgs_EXName = datas.division_name;
                    row.phid_emp = datas.project_manager_phid;
                    row.phid_emp_EXName = datas.project_manager_name;
                    row.u_pc_type = datas.type_phid;
                    row.u_pc_type_EXName = datas.type_name;
                    row.u_pc_stage = datas.user_stage;
                    gridTab.updateRow(row);
                } catch (error) { }
            });
            if(!row.u_pc_stage){
                    $NG.execServer("getProjInfo", { pc: row.phid_pc }, function (res) {
                    try {
                        const datas = JSON.parse(res.data)[0].extendObjects;
                        console.log(datas, "getPtInfoByPhidp_form_work_hour_d");
                        row.u_pc_stage = datas.user_stage;
                        row.u_pc_stage_EXName = datas.xmjd_name;
                        gridTab.updateRow(row);
                    } catch (error) { }
                });
            }
            if(!row.u_ssye){
                $NG.execServer("get_impl_cost_budget_info", { phid_pc: row.phid_pc }, function (res) {
                try {
                    const datas = JSON.parse(res.data)[0].extendObjects;
                    console.log(datas, "getPtInfoByPhidp_form_work_hour_d");
                    row.u_ssye = datas.u_total_impl_amt;
                    gridTab.updateRow(row);
                } catch (error) { }
            });
            }
            if(!row.u_fwye){
                $NG.execServer("get_svc_cost_budget_info", { phid_pc: row.phid_pc }, function (res) {
                try {
                    const datas = JSON.parse(res.data)[0].extendObjects;
                    console.log(datas, "getPtInfoByPhidp_form_work_hour_d");
                    row.u_fwye = datas.u_total_svc_amt;
                    gridTab.updateRow(row);
                } catch (error) { }
            });
            }
            
        }, "phid_pc");

    }
    useUpdateRows(async ({ args }) => {
        // 获取当前时间，并设置时间为当天的开始时间（忽略时间部分）
        const now = new Date();
        now.setHours(0, 0, 0, 0); // 设置为当天的开始时间

        let futureDateAlertShown = false; // 标志变量，用于避免重复显示未来工时警告

        // 使用 map 来处理所有的行，并生成一个包含所有行处理 Promise 的数组
        const rowPromises = grid.getRows().map(async (row) => {
            // 将日期字符串转换为 Date 对象，并设置时间为当天的开始时间
            let startDt = new Date(row.u_start_dt);
            startDt.setHours(0, 0, 0, 0);
            let endDt = new Date(row.u_end_dt);
            endDt.setHours(0, 0, 0, 0);
            // 检查开始和结束日期是否大于当前时间
            if (!futureDateAlertShown && (startDt > now)) {
                row.u_work_hour = 0;
                row.u_start_dt = null;
                $NG.alert("不可上报未来工时，请检查！存在所选日期大于当前日期的时间。");
                futureDateAlertShown = true; // 设置标志变量以避免重复显示警告
                return; // 结束当前行的处理
            }
            else if (!futureDateAlertShown && (endDt > now)) {
                row.u_work_hour = 0;
                row.u_end_dt = null;
                $NG.alert("不可上报未来工时，请检查！存在所选日期大于当前日期的时间。");
                futureDateAlertShown = true; // 设置标志变量以避免重复显示警告
                return; // 结束当前行的处理
            }

            // 检查开始日期是否大于结束日期
            if (startDt > endDt) {
                row.u_work_hour = 0;
                row.u_end_dt = null;
                $NG.alert("开始日期不能大于结束日期");
                return; // 结束当前行的处理
            }

            // 如果开始和结束日期有效，则调用 getWorkDates 函数计算工作小时数
            if (row.u_start_dt && row.u_end_dt) {
                try {
                    row.u_work_hour = await getWorkDates(row.u_start_dt, row.u_end_dt);
                } catch (error) {
                    console.error("Error calculating work dates:", error);
                    // 可以选择在这里处理错误，比如给用户提示或者设置默认值
                    row.u_work_hour = 0;
                }
            }
        });

        // 等待所有的行处理完成
        await Promise.all(rowPromises);

        // 所有行处理完成后刷新视图
        await grid.refreshView();
    }, "p_form_work_hour_d");

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    useUpdateRows(async ({ args, table }) => {
    
        const gridTab = $NG.getCmpApi("p_form_work_hour_d"); // 获取 tab 页数据
        const rows = grid.getRows(); // 获取所有行
    
        // 定义一个函数来处理单行的数据更新
        const updateRowData = async (row) => {
            try {
                // 请求 1: 获取生产信息
                const res1 = await fetchWithRetry($NG.execServer, { phid: row.phid_pc }, "getPtInfoByPhid", 3);
                if (res1) {
                    row.u_pc_no = res1.pc_no;
                    row.u_cpx = res1.midwife_phid;
                    row.u_cpx_EXName = res1.midwife_name;
                    row.u_fgs = res1.division_phid;
                    row.u_fgs_EXName = res1.division_name;
                    row.phid_emp = res1.project_manager_phid;
                    row.phid_emp_EXName = res1.project_manager_name;
                    row.u_pc_type = res1.type_phid;
                    row.u_pc_type_EXName = res1.type_name;
                }
    
                // 请求 2: 获取项目信息
                const res2 = await fetchWithRetry($NG.execServer, { pc: row.phid_pc }, "getProjInfo", 3);
                if (res2) {
                    row.u_pc_stage = res2.user_stage;
                    row.u_pc_stage_EXName = res2.xmjd_name;
                }
    
                // 请求 3: 获取实施成本预算信息
                const res3 = await fetchWithRetry($NG.execServer, { phid_pc: row.phid_pc }, "get_impl_cost_budget_info", 3);
                if (res3) {
                    row.u_ssye = res3.u_total_impl_amt;
                }
    
                // 请求 4: 获取服务成本预算信息
                const res4 = await fetchWithRetry($NG.execServer, { phid_pc: row.phid_pc }, "get_svc_cost_budget_info", 3);
                if (res4) {
                    row.u_fwye = res4.u_total_svc_amt;
                }
    
                // 更新当前行
                gridTab.updateRow(row);
            } catch (error) {
                console.error(`处理行 ${row.phid_pc} 时出错:`, error);
            }
        };
    
        // 定义一个带重试机制的请求函数
        const fetchWithRetry = async (apiFunction, params, apiName, retries = 3) => {
            for (let attempt = 1; attempt <= retries; attempt++) {
                try {
                    return await new Promise((resolve, reject) => {
                        apiFunction(apiName, params, (res) => {
                            try {
                                if (!res || !res.data || res.count == 0) {
                                    return 
                                }
                                const parsedData = JSON.parse(res.data);
                                if (!Array.isArray(parsedData) || parsedData.length === 0) {
                                    throw new Error(`${apiName}: 返回的数据不是有效的数组`);
                                }
                                resolve(parsedData[0].extendObjects);
                            } catch (error) {
                                reject(error);
                            }
                        });
                    });
                } catch (error) {
                    console.warn(`${apiName} 第 ${attempt} 次尝试失败:`, error);
                    if (attempt === retries) {
                        console.error(`${apiName} 超过最大重试次数，放弃请求`);
                        throw error; // 超过最大重试次数，抛出错误
                    }
                }
            }
        };
    
        // 并发处理所有行，但限制并发数以避免资源耗尽
        const processRowsWithConcurrency = async (rows, concurrencyLimit = 5) => {
            const results = [];
            const executing = [];
    
            for (const row of rows) {
                const promise = updateRowData(row).then((result) => {
                    results.push(result);
                }).catch((error) => {
                    console.error("行处理失败:", error);
                });
    
                executing.push(promise);
    
                // 如果达到并发限制，则等待其中一个完成
                if (executing.length >= concurrencyLimit) {
                    await Promise.race(executing);
                }
            }
    
            // 等待所有任务完成
            await Promise.allSettled(executing);
        };

        // 处理所有行并刷新视图
        await processRowsWithConcurrency(rows);
    
        // 所有行处理完成后刷新视图
        grid.refreshView();
    }, "p_form_work_hour_d");






    // 异步函数：计算符合条件的天数
    async function getWorkDates(startDate, endDate) {
        let count = 0;
        let datas = [];
        let datasMap = new Map(); // 用 Map 存储日期映射，提高查询效率

        // 遍历日期范围
        let currentDate = new Date(startDate);
        let lastDate = new Date(endDate);

        // 获取数据
        datas = await new Promise((resolve) => {
            $NG.execServer("getWorkDataSet", { sdt: `'${startDate}'`, edt: `'${endDate}'` }, (res) => {
                try {
                    resolve(JSON.parse(res.data).map((item) => item.extendObjects));
                } catch (err) {
                    resolve([]); // 确保解析失败时返回空数组
                }
            });
        });

        // 将数据存入 Map，避免重复查找
        datas.forEach((item) => datasMap.set(item.cdate, item.ctype));

        while (currentDate <= lastDate) {
            const day = currentDate.getDay();
            const dateStr = currentDate.toISOString().split("T")[0]; // 格式化为 YYYY-MM-DD

            // 直接从 Map 获取 ctype，提高查询效率
            let ctype = datasMap.get(dateStr) ?? null;

            if ((day !== 6 && day !== 0 && (ctype == "1" || ctype === null)) || ((day === 6 || day === 0) && ctype === "1")) {
                count++;
            }

            currentDate.setDate(currentDate.getDate() + 1);
        }

        return count;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    useBeforeClick(async function ({ args }) {
        // 按钮点击前事件
        const grid = $NG.getCmpApi("p_form_work_hour_d");

        for (var i = 0; i < grid.getRows().length; i++) {
            var lx = grid.getRows()[i].u_sblx;
            var num1 = grid.getRows()[i].u_work_hour;
            var num2 = grid.getRows()[i].u_fwye;
            var num3 = grid.getRows()[i].u_ssye;
            var pc = grid.getRows()[i].phid_pc_EXName;
            var stage = grid.getRows()[i].u_pc_stage;

            console.log(grid.getRows()[i])

            // if (stage == '8570000000000783' && lx == '2') {
            //     $NG.alert(`${pc}不得超项目阶段上报工时，实施阶段不允许上报服务工时`);
            //     return false;
            // }
            // else if (stage == '8570000000000782') {
            //     $NG.alert(`${pc}项目待启动阶段不允许上报工时`);
            //     return false;
            // }

            if (lx == '1') {
                if ((num1 * 780) > num3) {
                    $NG.alert(`${pc}超出项目实施人工费余额，请修改`);
                    return false;
                }
            }
            else if (lx == '2') {
                if ((num1 * 780) > num2) {
                    $NG.alert(`${pc}超出项目服务人工费余额，请修改`);
                    return false;
                }
            }

        }
        if(isOne(null,true)){
            $NG.alert("明细项目不唯一，请修改成同一个！")
            return false
        }

    }, "save");
    // 检查项目是否唯一
    function isOne(row, onlyVerify = false){
        const rows = grid.getRows()
        const projects = rows.reduce((value,item)=>{
            if(item.phid_pc){
                value.push(item.phid_pc)
            }
            return value
        },[])
        if(new Set(projects).size >1){
            if(onlyVerify){
                return true
            }
            $NG.confirm('警告：当前明细项目名称不唯一，要求项目名称只能相同，点击取消需手动修改，点击确定将会用当前选中的项目覆盖其他行的所有项目名称！').then(function (result) {
                if(result){
                    rows.forEach(item=>{
                        item.phid_pc = row.phid_pc
                        item.phid_pc_EXName = row.phid_pc_EXName
                        item.u_pc_no = row.u_pc_no
                        item.phid_emp = row.phid_emp
                        item.phid_emp_EXName = row.phid_emp_EXName
                        item.u_cpx = row.u_cpx
                        item.u_cpx_EXName = row.u_cpx_EXName
                        item.Bigint = row.Bigint
                        item.u_fgs = row.u_fgs
                        item.u_fgs_EXName = row.u_fgs_EXName
                    })
                    grid.refreshView()
                }
            });
        }
    }
});


